home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / util / lev_comp.l < prev    next >
Text File  |  1993-01-23  |  8KB  |  260 lines

  1. %{
  2. /*    SCCS Id: @(#)lev_lex.c    3.1    92/07/12    */
  3. /*    Copyright (c) 1989 by Jean-Christophe Collet */
  4. /* NetHack may be freely redistributed.  See license for details. */
  5.  
  6. #define LEV_LEX_C
  7.  
  8. #include "hack.h"
  9. #include "lev_comp.h"
  10. #include "sp_lev.h"
  11.  
  12. /* Most of these don't exist in flex, yywrap is macro and
  13.  * yyunput is properly declared in flex.skel.
  14.  */
  15. #ifndef FLEX_SCANNER
  16. int FDECL (yyback, (int *, int));
  17. int NDECL (yylook);
  18. int NDECL (yyinput);
  19. int NDECL (yywrap);
  20. int NDECL (yylex);
  21.     /* Traditional lexes let yyunput() and yyoutput() default to int;
  22.      * newer ones may declare them as void since they don't return
  23.      * values.  For even more fun, the lex supplied as part of the
  24.      * newer unbundled compiler for SunOS 4.x adds the void declarations
  25.      * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
  26.      * int) while the bundled lex and the one with the older unbundled
  27.      * compiler do not.  To detect this, we need help from outside --
  28.      * sys/unix/Makefile.utl.
  29.      */
  30. # if defined(NeXT) || defined(SVR4)
  31. #  define VOIDYYPUT
  32. # endif
  33. # if !defined(VOIDYYPUT)
  34. #  if defined(POSIX_TYPES) && !defined(BOS) && !defined(HISX)
  35. #   define VOIDYYPUT
  36. #  endif
  37. # endif
  38. # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
  39. #  if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX != 0) 
  40. #   define VOIDYYPUT
  41. #  endif
  42. # endif
  43. # ifdef VOIDYYPUT
  44. void FDECL (yyunput, (int));
  45. void FDECL (yyoutput, (int));
  46. # else
  47. int FDECL (yyunput, (int));
  48. int FDECL (yyoutput, (int));
  49. # endif
  50. #endif    /* FLEX_SCANNER */
  51.  
  52. void FDECL (init_yyin, (FILE *));
  53. void FDECL (init_yyout, (FILE *));
  54.  
  55. #ifdef MICRO
  56. #undef exit
  57. extern void FDECL(exit, (int));
  58. #endif
  59.  
  60. /* this doesn't always get put in lev_comp.h
  61.  * (esp. when using older versions of bison)
  62.  */
  63.  
  64. extern YYSTYPE yylval;
  65.  
  66. int line_number = 1, colon_line_number = 1;
  67.  
  68. /* This is *** UGLY *** but I can't think a better way to do it
  69.  * I really need a huge buffer to scan maps...
  70.  */
  71.  
  72. #undef YYLMAX
  73. #define YYLMAX    2048
  74.  
  75. /*
  76.  *    This is a hack required by Michael Hamel to get things
  77.  *    working on the Mac.
  78.  */
  79. #if defined(applec) && !defined(FLEX_SCANNER)
  80. #undef input
  81. #undef unput
  82. #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; }
  83. # ifndef YYNEWLINE
  84. # define YYNEWLINE 10
  85. # endif
  86.  
  87. char
  88. input() {    /* Under MPW \n is chr(13)! Compensate for this. */
  89.  
  90.     if (yysptr > yysbuf) return(*--yysptr);
  91.     else {
  92.         yytchar = getc(yyin);
  93.         if (yytchar == '\n') {
  94.             yylineno++;
  95.             return(YYNEWLINE);
  96.         }
  97.         if (yytchar == EOF) return(0);
  98.         else            return(yytchar);
  99.     }
  100. }
  101. #endif    /* applec && !FLEX_SCANNER */
  102.  
  103. %}
  104. %e 1500
  105. %p 5000
  106. %n 600
  107. %s MAPC
  108. %%
  109. <MAPC>ENDMAP    {
  110. #ifdef FLEX_SCANNER
  111.           /*
  112.            * There is a bug in Flex 2.3 patch level < 6
  113.            * (absent in previous versions)
  114.            * that results in the following behaviour :
  115.            * Once you enter an yymore(), you never exit from it.
  116.            * This should do the trick!
  117.            */
  118.           extern int yy_more_len;
  119.  
  120.           yy_more_len = 0;
  121. #endif
  122.           BEGIN(INITIAL);
  123.           yylval.map = (char *) alloc(yyleng-5);
  124.           strncpy(yylval.map, yytext,yyleng-6);
  125.           yylval.map[yyleng-6] = 0;
  126.           return MAP_ID;
  127.         }
  128. <MAPC>[-|}{+ABCISKPLW\\#. ]*\n    { line_number++; yymore(); }
  129. ^#.*\n        { line_number++; }
  130. :        { colon_line_number = line_number; return ':'; }
  131. MESSAGE        return MESSAGE_ID;
  132. MAZE        return MAZE_ID;
  133. NOMAP        return NOMAP_ID;
  134. LEVEL        return LEVEL_ID;
  135. INIT_MAP    return LEV_INIT_ID;
  136. FLAGS        return FLAGS_ID;
  137. GEOMETRY    return GEOMETRY_ID;
  138. ^MAP\n        { BEGIN(MAPC); line_number++; }
  139. OBJECT        return OBJECT_ID;
  140. MONSTER        return MONSTER_ID;
  141. TRAP        return TRAP_ID;
  142. DOOR        return DOOR_ID;
  143. DRAWBRIDGE    return DRAWBRIDGE_ID;
  144. MAZEWALK    return MAZEWALK_ID;
  145. WALLIFY        return WALLIFY_ID;
  146. REGION        return REGION_ID;
  147. RANDOM_OBJECTS    return RANDOM_OBJECTS_ID;
  148. RANDOM_MONSTERS    return RANDOM_MONSTERS_ID;
  149. RANDOM_PLACES    return RANDOM_PLACES_ID;
  150. ALTAR        return ALTAR_ID;
  151. LADDER        return LADDER_ID;
  152. STAIR        return STAIR_ID;
  153. PORTAL        return PORTAL_ID;
  154. TELEPORT_REGION    return TELEPRT_ID;
  155. BRANCH        return BRANCH_ID;
  156. FOUNTAIN    return FOUNTAIN_ID;
  157. SINK        return SINK_ID;
  158. POOL        return POOL_ID;
  159. NON_DIGGABLE    return NON_DIGGABLE_ID;
  160. ROOM        return ROOM_ID;
  161. SUBROOM        return SUBROOM_ID;
  162. RANDOM_CORRIDORS    return RAND_CORRIDOR_ID;
  163. CORRIDOR    return CORRIDOR_ID;
  164. GOLD        return GOLD_ID;
  165. ENGRAVING    return ENGRAVING_ID;
  166. NAME        return NAME_ID;
  167. CHANCE        return CHANCE_ID;
  168. levregion    return LEV;
  169. open        { yylval.i=D_ISOPEN; return DOOR_STATE; }
  170. closed        { yylval.i=D_CLOSED; return DOOR_STATE; }
  171. locked        { yylval.i=D_LOCKED; return DOOR_STATE; }
  172. nodoor        { yylval.i=D_NODOOR; return DOOR_STATE; }
  173. broken        { yylval.i=D_BROKEN; return DOOR_STATE; }
  174. north        { yylval.i=W_NORTH; return DIRECTION; }
  175. east        { yylval.i=W_EAST; return DIRECTION; }
  176. south        { yylval.i=W_SOUTH; return DIRECTION; }
  177. west        { yylval.i=W_WEST; return DIRECTION; }
  178. random        { yylval.i = -1; return RANDOM_TYPE; }
  179. none        { yylval.i = -2; return NONE; }
  180. object        return O_REGISTER;
  181. monster        return M_REGISTER;
  182. place        return P_REGISTER;
  183. align        return A_REGISTER;
  184. left        { yylval.i=1; return LEFT_OR_RIGHT; }
  185. half-left    { yylval.i=2; return LEFT_OR_RIGHT; }
  186. center        { yylval.i=3; return CENTER; }
  187. half-right    { yylval.i=4; return LEFT_OR_RIGHT; }
  188. right        { yylval.i=5; return LEFT_OR_RIGHT; }
  189. top        { yylval.i=1; return TOP_OR_BOT; }
  190. bottom        { yylval.i=5; return TOP_OR_BOT; }
  191. lit        { yylval.i=1; return LIGHT_STATE; }
  192. unlit        { yylval.i=0; return LIGHT_STATE; }
  193. filled        { yylval.i=0; return FILLING; }
  194. unfilled    { yylval.i=1; return FILLING; }
  195. noalign        { yylval.i= AM_NONE; return ALIGNMENT; }
  196. law        { yylval.i= AM_LAWFUL; return ALIGNMENT; }
  197. neutral        { yylval.i= AM_NEUTRAL; return ALIGNMENT; }
  198. chaos        { yylval.i= AM_CHAOTIC; return ALIGNMENT; }
  199. peaceful    { yylval.i=1; return MON_ATTITUDE; }
  200. hostile        { yylval.i=0; return MON_ATTITUDE; }
  201. asleep        { yylval.i=1; return MON_ALERTNESS; }
  202. awake        { yylval.i=0; return MON_ALERTNESS; }
  203. m_feature    { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; }
  204. m_monster    { yylval.i= M_AP_MONSTER;   return MON_APPEARANCE; }
  205. m_object    { yylval.i= M_AP_OBJECT;    return MON_APPEARANCE; }
  206. sanctum        { yylval.i=2; return ALTAR_TYPE; }
  207. shrine        { yylval.i=1; return ALTAR_TYPE; }
  208. altar        { yylval.i=0; return ALTAR_TYPE; }
  209. up        { yylval.i=1; return UP_OR_DOWN; }
  210. down        { yylval.i=0; return UP_OR_DOWN; }
  211. false        { yylval.i=0; return BOOLEAN; }
  212. true        { yylval.i=1; return BOOLEAN; }
  213. dust        { yylval.i=DUST; return ENGRAVING_TYPE; }
  214. engrave        { yylval.i=ENGRAVE; return ENGRAVING_TYPE; }
  215. burn        { yylval.i=BURN; return ENGRAVING_TYPE; }
  216. mark        { yylval.i=MARK; return ENGRAVING_TYPE; }
  217. blessed        { yylval.i=1; return CURSE_TYPE; }
  218. uncursed    { yylval.i=2; return CURSE_TYPE; }
  219. cursed        { yylval.i=3; return CURSE_TYPE; }
  220. noteleport    { yylval.i=NOTELEPORT; return FLAG_TYPE; }
  221. hardfloor    { yylval.i=HARDFLOOR; return FLAG_TYPE; }
  222. nommap        { yylval.i=NOMMAP; return FLAG_TYPE; }
  223. shortsighted    { yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
  224. [+\-]?[0-9]+    { yylval.i=atoi(yytext); return INTEGER; }
  225. \"[^"]*\"    { yytext[yyleng-1] = 0; /* Discard the trailing \" */
  226.           yylval.map = (char *) alloc(strlen(yytext+1)+1);
  227.           strcpy(yylval.map, yytext+1); /* Discard the first \" */
  228.           return STRING; }
  229. \n        { line_number++; }
  230. [ \t]+        ;
  231. '.'        { yylval.i = yytext[1]; return CHAR; }
  232. .        { return yytext[0]; }
  233. %%
  234. #ifdef    AMIGA
  235. long *alloc(n)
  236.     unsigned n;
  237. {
  238.     return ((long *)malloc (n));
  239. }
  240. #endif
  241.  
  242. /* routine to switch to another input file; needed for flex */
  243. void init_yyin( input_f )
  244. FILE *input_f;
  245. {
  246. #ifdef FLEX_SCANNER
  247.     if (yyin)
  248.         yyrestart(input_f);
  249.     else
  250. #endif
  251.         yyin = input_f;
  252. }
  253. /* analogous routine (for completeness) */
  254. void init_yyout( output_f )
  255. FILE *output_f;
  256. {
  257.     yyout = output_f;
  258. }
  259.  
  260.